#include "chinactpquotethread.h"
#include <QDebug>

ChinactpQuoteThread::ChinactpQuoteThread(QObject *parent) : QThread(parent) {}

ChinactpQuoteThread::~ChinactpQuoteThread() {
    stopMd();
}

// 启动行情服务（在主线程调用）
void ChinactpQuoteThread::startMd(const QString &frontAddr,const QStringList &instrunments) {
    m_frontAddr = frontAddr;
    instrumentList = instrunments;
    if (!isRunning()) {
        m_running = true;
        start();  // 启动线程（调用run()）
    }
}

// 停止行情服务
void ChinactpQuoteThread::stopMd() {
    m_running = false;
    if (m_mdApi) {
        qDebug() << "ChinactpQuoteThread 开始退出任务" << currentThreadId();
        //m_mdApi->Join(); // 等待API内部线程结束
        m_mdApi->Release();  // 释放API资源
        m_mdApi = nullptr;
        qDebug() << "ChinactpQuoteThread 完成处理退出任务" << currentThreadId();
    }
    // 等待线程结束
    if (!wait(500)) {
        qWarning() << "线程无法正常退出，强制终止！";
        terminate(); // 强制终止（可能导致资源泄漏）
        wait(); // 等待强制终止完成
    }
    qDebug() << "ChinactpQuoteThread 退出任务成功" << currentThreadId();
}

// 线程入口（独立线程中运行）
void ChinactpQuoteThread::run() {
    //qDebug() << "行情线程启动，线程ID：" << currentThreadId();

    // 创建API实例（必须在当前线程中创建）
    m_mdApi = CThostFtdcMdApi::CreateFtdcMdApi();

    // 创建回调实例
    m_mdSpi = new ChinactpRealtime(m_mdApi);
    m_mdSpi->OnSetInstrument(instrumentList);

    // 注册回调接口
    m_mdApi->RegisterSpi(m_mdSpi);

    m_mdApi->RegisterFront((char*)m_frontAddr.toUtf8().data());

    // 初始化API
    m_mdApi->Init();

    // 转发信号（回调中不能直接操作UI，通过信号到主线程）
    connect(m_mdSpi, &ChinactpRealtime::connected, this, &ChinactpQuoteThread::connected);
    connect(m_mdSpi, &ChinactpRealtime::disconnected, this, &ChinactpQuoteThread::disconnected);
    connect(m_mdSpi, &ChinactpRealtime::loginResult, this, &ChinactpQuoteThread::loginResult);
    connect(m_mdSpi, &ChinactpRealtime::marketDataReceived, this, &ChinactpQuoteThread::marketDataReceived);

    // 线程循环（保持线程运行）
    exec();  // 启动事件循环

    // 清理资源
    delete m_mdSpi;
    m_mdSpi = nullptr;
}
